// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
use std::fs;
use std::fs::File;
use std::path::Path;
// use tauri::command;
use tauri::Manager;
use std::io::Write;


#[tauri::command]
fn write_file(path: String, content: String) -> Result<(), String> {
    File::create(&path)
        .and_then(|mut file| file.write_all(content.as_bytes()))
        .map_err(|e| format!("文件写入失败: {}", e))
}


#[tauri::command]
fn rename_file(old_path: String, new_path: String) -> Result<(), String> {

    // 判断目标文件是否已存在
    let new_path = Path::new(&new_path);
    if new_path.exists() {
        return Err("目标文件已存在".into());
    }

    let old_path = Path::new(&old_path);
    let new_path: &Path = Path::new(&new_path);

    std::fs::rename(old_path, new_path).map_err(|e| format!("重命名失败: {}", e))?;

    Ok(())
}

#[tauri::command]
async fn read_file(path: String) -> Result<String, String> {
    fs::read_to_string(&path).map_err(|err| err.to_string())
}

#[tauri::command]
fn delete_file(path: String) -> Result<(), String> {
    fs::remove_file(&path).map_err(|e| e.to_string())
}




#[tauri::command]
fn create_txt_file(app_handle: tauri::AppHandle, file_name: String) -> Result<String, String> {
    // 验证文件名（允许点号，因为我们需要文件扩展名）
    if file_name.trim().is_empty() {
        return Err("文件名不能为空".into());
    }

    // 阻止路径穿越和非法字符（允许点号）
    if file_name.contains("..")
        || file_name.contains('/')
        || file_name.contains('\\')
        || file_name.contains(':')
        || file_name.contains('*')
        || file_name.contains('?')
        || file_name.contains('"')
        || file_name.contains('<')
        || file_name.contains('>')
        || file_name.contains('|')
    {
        return Err("文件名包含非法字符".into());
    }

    // 获取下载目录
    let downloads_dir = app_handle
        .path()
        .download_dir()
        .map_err(|e| format!("无法获取下载目录: {}", e))?;

    // 确保下载目录存在
    if !downloads_dir.exists() {
        fs::create_dir_all(&downloads_dir).map_err(|e| format!("无法创建下载目录: {}", e))?;
    }

    // 构建安全路径
    let mut file_path = downloads_dir.join(&file_name);

    // 确保文件有.txt扩展名
    if file_path.extension().is_none() {
        file_path.set_extension("txt");
    }

    // 检查文件是否已存在
    if file_path.exists() {
        return Err("文件已存在".into());
    }

    // 创建父目录（如果必要）
    if let Some(parent) = file_path.parent() {
        if !parent.exists() {
            fs::create_dir_all(parent).map_err(|e| format!("无法创建目录: {}", e))?;
        }
    }

    // 创建文件并处理错误
    File::create(&file_path).map_err(|e| match e.kind() {
        std::io::ErrorKind::PermissionDenied => "无文件创建权限".into(),
        std::io::ErrorKind::NotFound => "目录不存在".into(),
        std::io::ErrorKind::AlreadyExists => "文件已存在".into(),
        _ => format!("创建文件失败: {}", e),
    })?;

    // 默认文件内容
    let default_content = if file_name.to_lowercase().contains("readme") {
        // README 文件的特殊内容
        "# 欢迎使用本应用\n\n这是一个自动生成的 README 文件。".to_string()
    } else {
        // 通用默认内容
        format!(
            "文件名: {}\n创建时间: {}\n\n这是一个自动生成的文本文件。",
            file_name,
            chrono::Local::now().format("%Y-%m-%d %H:%M:%S")
        )
    };

    // 创建文件并写入默认内容
    fs::write(&file_path, default_content).map_err(|e| match e.kind() {
        std::io::ErrorKind::PermissionDenied => "无文件创建权限".into(),
        std::io::ErrorKind::NotFound => "目录不存在".into(),
        std::io::ErrorKind::AlreadyExists => "文件已存在".into(),
        _ => format!("创建文件失败: {}", e),
    })?;

    // 返回文件路径
    file_path
        .to_str()
        .map(|s| s.to_string())
        .ok_or("路径包含无效字符".into())
}

// 您必须向构建器函数提供命令列表，如下所示：
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_dialog::init())
        .plugin(tauri_plugin_fs::init())
        .plugin(tauri_plugin_opener::init())
        .invoke_handler(tauri::generate_handler![
            read_file,
            create_txt_file,
            delete_file,
            rename_file,
            write_file
        ])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
